package string;
/**
 * String字符串类:
 * 1.java会将所有使用字面量(直接量)形式创建的字符串对象缓存在常量池中，
 *   每当使用相同字面量形式创建字符串对象时，会复用对象以减少内存开销
 *   只有字面量会存在常量池中
 * 2.new String()创建时，一定会创建新对象
 * 3.String是不变对象，创建后内容不可改变，若改变则创建新对象
 * 4.若想比较字符串内容相同，需要使用equals()方法
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc";//字面量创建的字符串第一次使用时会缓存在常量池中
        String s2 = "123abc";//复用s1
        String s3 = "123abc";//还是在复用
        String s4 = new String("123abc"); //new是一定创建新对象，不推荐这样的方式来创建字符串对象
        System.out.println(s1==s2);//true s1和s2为引用类型变量，保存的是地址，此时地址相同
        System.out.println(s1==s3);//true
        System.out.println(s1==s4);//false 1 4地址不同

        String s = "123";
        String s5 = s + "abc";//拼接字符串会产生新对象，s5指向新对象
        System.out.println(s1==s5);;//flase 没用常量池的123abc
        String s6 = "123" + "abc";//两个字面量连接时，会触发预计算特性 他等于String s6 = "123abc"
        System.out.println(s1== s6);//true

        String s7 = "123abc";
        String s8 = new String("123abc");
        System.out.println(s7==s8);//false ==比较的是地址 地址不同所以
        System.out.println(s7.equals(s8));//true equals它只比较内容 所以为true



    }
}
